/**
 * 1.Promise 就是一个类 在执行这个类的时候 需要传递一个执行器进去 执行器会立即执行
 * 2.Promise 中有三种状态 分别为 fulfilled rejected pending
 *    pending -> fulfilled
 *    pending -> rejected
 *    状态不可逆
 *  3.resolve和reject函数是用来更改状态的
 *    resolve：fulfilled
 *    reject: rejected
 *  4.then方法内部做的事情就是判断状态，如果状态是成功 调用成功的回调函数，反之，调用失败的回调函数
 *    then方法是被定义在原型对象中的
 *  5.then成功回调有一个参数，表示成功之后的值 then失败回调有一个参数 表示失败后的原因
 */

 const MyPromise = require('./myPromise');

 let promise = new MyPromise((resolve, reject) => {
   //  setTimeout(() => {
   //    resolve('成功')
   //  }, 200);
   // throw new Error('executor error')
   // resolve('成功')
   reject('失败')
 })

 function other() {
    return new MyPromise((resolve, reject) => {
      resolve('other');
    })
 }
//  promise.then(
//    value => { 
//       console.log(value);
//       return 'aaa'
//       // throw new Error('then error')
//    },
//    reason => { console.log(reason); return 1000}
//  )
//  .then(
//    value => { console.log(value); return 20 },
//    reason => { console.log(reason) }
// )

// promise
//    .then()
//    .then(
//       value => { console.log(value) },
//       reason => { console.log(reason) }
//    );

function p1 () {
   return new MyPromise(function(resolve, reject) {
      setTimeout(function() {
         resolve('p1');
      }, 2000)
   })
}

function p2 () {
   return new MyPromise(function(resolve, reject) {
      resolve('p2 success');
      // reject('p2 reject')
   })
}
// MyPromise.all(['a', 'b', p1(), p2(), 'c'])
//    .then(value => console.log(value))

// MyPromise.resolve(p1()).then(value => console.log(value));

// p2().finally(() => {
//    console.log('finally');
//    return p1();
// }).then(value => {
//    console.log(value)
// }, reason => {
//    console.log(reason);
// })

// p2().then(value => console.log(value))
//    .catch(reason => console.log(reason))
//    .then(value => console.log(value))

// setTimeout(function() {
//    var a = 'hello '
//    setTimeout(function() {
//       var b = 'lagou '
//       setTimeout(function() {
//          var c = 'Love'
//          console.log(a + b + c);
//       }, 10)
//    }, 10)
// }, 10)

let promiseFn = (str, time) => {
   return new Promise((resolve, reject) => {
      setTimeout(() => {
         resolve(str);
      }, time)
   })
}

promiseFn('hello', 10)
.then(value => {
   return promiseFn(value + 'lagou', 10);
})
.then(value => {
   return promiseFn(value + 'Love', 10);
})
.then(value => {
   console.log(value);
})
